﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TCC.ControleFluxoDeCaixa.Model.Contas;
using TCC.ControleFluxoDeCaixa.Model.Entities;
using TCC.ControleFluxoDeCaixa.Model.Fluxo;

namespace TCC.ControleFluxoDeCaixa.Test
{
    [TestClass]
    public class UnidadeDeTesteLancamentoRecorrente
    {    

        [TestMethod]
        public void TestGerarVencimentosMensal()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 08),
                DataFim = new DateTime(2015, 01, 08),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Mes, Valor = 1}
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);
            Assert.IsTrue(l.GetVencimentos().Count() == 13);
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.IsTrue(l.Lancamentos.Count == 13);
        }
        [TestMethod]
        public void TestGerarVencimentosTrimestral()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 08),
                DataFim = new DateTime(2015, 01, 01),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Mes, Valor = 3}
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);
            Assert.IsTrue(l.GetVencimentos().Count() == 4);
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.IsTrue(l.Lancamentos.Count == 4);
        }
        [TestMethod]
        public void TestGerarVencimentosSemanal()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 08),
                DataFim = new DateTime(2014, 02, 05),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Semana, Valor = 2}
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);
            Assert.AreEqual(3, l.GetVencimentos().Count());
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.AreEqual(3, l.Lancamentos.Count);
        }
        [TestMethod]
        public void TestGerarVencimentosMensalComAnual()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 01),
                DataFim = new DateTime(2020, 01, 01),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Mes, Valor = 6},
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Ano, Valor = 1},
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);

            Assert.AreEqual(5, l.GetVencimentos().Count());
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.AreEqual(5, l.Lancamentos.Count);
        }
        [TestMethod]
        public void TestGerarVencimentosDiario()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 08),
                DataFim = new DateTime(2014, 01, 15),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Dia, Valor =  1}
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);
            Assert.AreEqual(8, l.GetVencimentos().Count());
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.AreEqual(8, l.Lancamentos.Count);
        }
        [TestMethod]
        public void TestGerarVencimentosAnual()
        {
            var l = new LancamentoRecorrente
            {
                DataInicio = new DateTime(2014, 01, 08),
                DataFim = new DateTime(2020, 10, 10),
                UnidadesDeRecorrencia =
                {
                    new LancamentoRecorrenteUnidadeTempo {UnidadeTempo = UnidadeTempo.Ano, Valor = 1}
                }
            };
            Trace.WriteLine(l);
            foreach (var vencimento in l.GetVencimentos()) Trace.WriteLine(vencimento);
            Assert.IsTrue(l.GetVencimentos().Count() == 7);
            Assert.IsTrue(!l.Lancamentos.Any());
            l.AtualizarListaDeVencimentos();
            Assert.IsTrue(l.Lancamentos.Count == 7);
        }
    }
}
